﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Collections;

namespace BK_CLIENT
{
    public partial class CLIENT_FORM : Form
    {
        ClientWebcam wc;
        // Biến xác nhận trạng thái đăng nhập
        private bool is_login = false;
        // Phương thức cập nhật dữ liệu
        private delegate void UpdateStatusCallback(string stringMsg);
        // Đối tượng xử lí kết nối và truyền tin tới server
        private ConnectToServer newConn;
        // Mảng lưu trữ bạn bè và kết nối tương ứng
        public static Hashtable htSubFormFriend = new Hashtable(50);
        public static Hashtable htSubForm = new Hashtable(50);
        // Mảng lưu trữ các phòng chat và kết nối tương ứng
        public static Hashtable htSubFormChat = new Hashtable(20);
        public static Hashtable htChatForm = new Hashtable(20);
        // Tên thành viên đang đăng nhập
        private string me;
        public static string clientN;
        public static int check_wc;   // biến kiểm tra webcam có bật hay ko.
        public  string listRoom ;
        public string avatar = "soccer";
        public string myFriend = "";
        public string sNameOfFriendDelete = "";
        //Sửa thêm
        public static string sDirAvatar = "";
        
        // Khởi tạo form
        public CLIENT_FORM()
        {
            InitializeComponent();
            buttonLogout.Enabled = false;
            listRoom = "";
            sDirAvatar = System.Environment.CurrentDirectory;
            sDirAvatar = sDirAvatar + "\\Avatar\\";
            pictureBoxAvatar.ImageLocation = sDirAvatar + avatar + ".png";
            check_wc = 0;
        }
        ~CLIENT_FORM()
        {
            this.Dispose();
            this.Close();
        }
        // Xử lí sự kiện người dùng ấn nút REGISTER
        // Kiểm tra thông tin đầy đủ chưa
        // + Đầy đủ --> gửi yêu cầu đăng kí
        // + Không đầy đủ --> Đưa thông báo và thoát
        private void buttonRegister_Click(object sender, EventArgs e)
        {
            string userName = textBoxUserName.Text.ToString();
            string userPassword = textBoxPassword.Text.ToString();
            if (userName == "" || userPassword == "")
            {
                MessageBox.Show("Bạn chưa điền đầy đủ thông tin.\nHãy kiểm tra lại.");
                return;
            }
            string done = "#REGISTER#";
            ConnectToServer.statusChange += new StatusChangedEventHandler(mainClient_StatusChanged);
            newConn = new ConnectToServer(userName,userPassword,done);
            if (ConnectToServer.connected == true)
            {
                buttonRegister.Enabled = false;
                buttonLogout.Enabled = false;
                buttonLogin.Enabled = false;
            }
        }

        // Xử lí sự kiện người dùng ấn nút LOGIN
        // Kiểm tra thông tin đầy đủ chưa
        // + Không đầy đủ --> Đưa thông báo và thoát
        // + Đầy đủ --> gửi yêu cầu đăng nhập        
        // Nếu đăng nhập thành công --> thiết lập các trạng thái
        // Nếu thất bại --> hiển thị thông báo(Khi nhận lại thông báo thất bại từ phía server gửi về)
        private void buttonLogin_Click(object sender, EventArgs e)
        {
            string userName = textBoxUserName.Text.ToString();
            string userPassword = textBoxPassword.Text.ToString();

            if (userName == "" || userPassword == "")
            {
                MessageBox.Show("Bạn chưa điền đầy đủ thông tin.\nHãy kiểm tra lại.");
                return;
            }
            if (is_login == false)
            {
                string done = "#US_LOGIN#";
                ConnectToServer.statusChange += new StatusChangedEventHandler(mainClient_StatusChanged);
                newConn = new ConnectToServer(userName,userPassword,done);
                if(ConnectToServer.connected == true)
                {
                    me = userName;
                    buttonLogout.Enabled = false;
                    textBoxPassword.Enabled = false;
                    textBoxUserName.Enabled = false;
                    buttonRegister.Enabled = false;
                  //  buttonLogin.Enabled = false;
                }
            }
        }

        // Xử lí sự kiện người dùng ấn nút LOGOUT
        // Gọi phương thức Logout() trong lớp ConnectToServer để giải phóng tài nguyên
        // Đóng form
        private void buttonLogout_Click(object sender, EventArgs e)
        {
            newConn.Logout();
            this.Close();
        }

        // Tạo form chat
        public void CreateRoom(string roomName)
        {
            // Tạo phòng chat room
            try
            {
                CHAT_ROOM[] chatNew = new CHAT_ROOM[CLIENT_FORM.htSubFormChat.Count];
                CLIENT_FORM.htSubFormChat.Values.CopyTo(chatNew, 0);
                // Kiem tra xem xuat hien subform chua?
                for (int j = 0; j < chatNew.Length; j++)
                {
                    if (chatNew[j].Equals(htSubFormChat[roomName]))
                    {
                        this.RemoveChatRoomDialog(roomName);
                        break;
                    }
                }
                ShowFormChatRoom newRoom = new ShowFormChatRoom(this, roomName, me + "$", me);
            }
            // Lỗi tạo phòng
            catch
            {
                MessageBox.Show("Tạo phòng chat không thành công");
            }
        }

        // Cập nhật thông tin về form
        public void mainClient_StatusChanged(object sender, StatusChangedEventArgs e)
        {
            // Gọi phương thức cập nhật form
            this.Invoke(new UpdateStatusCallback(this.ProcessMsg), new object[] { e.EventMessage });
        }

        //Lấy nội dung từ chat các form chat hoặc chat room và gọi phương thức SendMessage để xử lí
        public void GetText(string newMsg, string source, string destination, int kindChat)
        {
            newConn.SendMessage(newMsg, source, destination, kindChat);
        }
      
        //Lấy nội dung file từ các form chat hoặc chat room và gọi phương thức SendFile để xử lí
        public void SendFile(string filePath, string source, string destination, int kindSend)
        {
            newConn.SendFile(filePath, source, destination, kindSend);
        }

        // Xóa các form chat
        public void RemoveChatDialog(string destination)
        {
            ShowSubForm.RemoveSubForm(destination);
        }
        // Xóa các form chat
        public void RemoveChatRoomDialog(string destination)
        {
            ShowFormChatRoom.RemoveFormRoom(destination);
        }
        // Phương thức xử lí các sự kiện
        public void ProcessMsg(string msg)
        
        {
            string content;
            string head;
            string friend;
            int pos;
            // Lấy mã thông điệp
            head = msg.Substring(0, 10);
            // Lấy nội dung thông điệp
            msg = msg.Remove(0, 10);
            bool exist = false;
            string fdName = "";
            if(msg.IndexOf("#") != -1)
            {
                fdName = msg.Substring(0, msg.IndexOf("#"));
            }
            switch (head)
            {

                // Nhận thông điệp chat
                // Kiểm tra xem form chat đã tồn tại hay chưa
                // Nếu chưa tồn tại thì tạo form mới, hiể thị nội dung

                case "#SEND_MSG#":
                    BK_CHAT[] chatFormSendMsg = new BK_CHAT[CLIENT_FORM.htSubFormFriend.Count];
                    CLIENT_FORM.htSubFormFriend.Values.CopyTo(chatFormSendMsg, 0);
                    friend = msg.Substring(0, msg.IndexOf("#"));
                    content = msg.Remove(0, msg.IndexOf("#") + 1);
                    content = "<font color = '#CC9900'>" + friend + ":</font> " + content;
                    for (int i = 0; i < chatFormSendMsg.Length; i++)
                    {
                        if (chatFormSendMsg[i].Equals(htSubFormFriend[friend]))
                        {
                            content = "<br>" + content;
                            chatFormSendMsg[i].DisplayMessage(content);
                            exist = true;
                        }
                        else
                        {
                            exist = false;
                        }
                    }
                    if (exist == false)
                    {
                        ShowSubForm newForm = new ShowSubForm(this, me, friend);
                        newForm.chatClient.DisplayMessage(content);
                    }
                    break;
                // Nhận yêu cầu xem webcam
                case "#RQWEBCAM#":
                    // kiem tra xem wc có dc bật hay ko?
                    if ( check_wc == 0 )
                    {
                        pos = msg.IndexOf("#");
                        friend = msg.Substring(0, pos);
                        GetText("0", me, friend, 10);      
                    } 
                    else
                    {
                        pos = msg.IndexOf("#");
                        string IPAddr = msg.Substring(pos+1, msg.Length - pos - 1);
                        wc.ClientWC.Connect(IPAddr, 198);
                        pos = msg.IndexOf("#");
                        friend = msg.Substring(0, pos);
                        GetText("1", me, friend, 10);
                    }
                    break;

                // Nhận trả lời yêu cầu xem webcam
                case "#RPWEBCAM#":
                    pos = msg.IndexOf("#");
                    string isWcOpen = msg.Substring(pos+1, 1);
                    if (isWcOpen.Equals("0"))
                    {
                        MessageBox.Show("Webcam ko mo");
                        // dong ket noi
                        chatFormSendMsg = new BK_CHAT[CLIENT_FORM.htSubFormFriend.Count];
                        CLIENT_FORM.htSubFormFriend.Values.CopyTo(chatFormSendMsg, 0);
                        friend = msg.Substring(0, msg.IndexOf("#"));

                        for (int i = 0; i < chatFormSendMsg.Length; i++)
                        {
                            if (chatFormSendMsg[i].Equals(htSubFormFriend[friend]))
                            {
                                chatFormSendMsg[i].wc.HostWC.CloseConnection();
                                chatFormSendMsg[i].wc.Dispose();
                                break;
                            }
                        }
                    }
                    break;

                // Nhận  thông tin từ phòng chat
                // Kiểm tra xem form phòng chat đã tồn tại hay chưa
                // Chưa tồn tại  thì tạo form mới
                // Hiển thị nội dung

                case "#CHATROOM#":
                    CHAT_ROOM[] chatRoom = new CHAT_ROOM[CLIENT_FORM.htSubFormChat.Count];
                    CLIENT_FORM.htSubFormChat.Values.CopyTo(chatRoom, 0);
                    pos = msg.IndexOf("#");
                    string room = msg.Substring(0, pos);
                    msg = msg.Remove(0, pos + 1);
                    string friendS = msg.Substring(0, msg.IndexOf("#"));
                    content = msg.Remove(0, msg.IndexOf("#") + 1);
                    content = "<font color = '#CC9900'>" + friendS + ":</font> " + content;
                    // Kiem tra xem xuat hien subform chua?
                    for (int i = 0; i < chatRoom.Length; i++)
                    {
                        if (chatRoom[i].Equals(htSubFormChat[room]))
                        {
                            chatRoom[i].DisplayMessage(content);
                            exist = true;
                        }
                        else
                        {
                            exist = false;
                        }
                    }
                    if (exist == false)
                    {
                        string mem = msg.Substring(0, msg.IndexOf("#")) + "$";
                        ShowFormChatRoom newRoom = new ShowFormChatRoom(this, room, mem, me);
                        newRoom.room.DisplayMessage(content);
                    }
                    break;

                // Nhận file từ thành viên khác
                // Kiểm tra sự xuất hiện của form chat
                // Chưa có thì khởi tạo form mới
                // Hiển thị thông báo có chấp nhận nhận file hay không
                // Nhận file nếu đồng ý
                case "#SENDFILE#":
                    BK_CHAT[] chatFormSendFile = new BK_CHAT[CLIENT_FORM.htSubFormFriend.Count];
                    CLIENT_FORM.htSubFormFriend.Values.CopyTo(chatFormSendFile, 0);
                    pos = msg.IndexOf("#");
                    friend = msg.Substring(0, pos);
                    //Lay ten file
                    msg = msg.Remove(0, pos + 1);
                    pos = msg.IndexOf("#");
                    string fileName = msg.Substring(0, pos);
                    msg = msg.Remove(0, pos + 1);
                    // Kiem tra xem xuat hien subform chua?
                    for (int i = 0; i < chatFormSendFile.Length; i++)
                    {
                        if (chatFormSendFile[i].Equals(htSubFormFriend[friend]))
                        {
                            chatFormSendFile[i].SaveFile(fileName, msg);
                            exist = true;
                        }
                    }
                    if (exist == false)
                    {
                        ShowSubForm newForm = new ShowSubForm(this, me, friend);
                        newForm.chatClient.SaveFile(fileName, msg);
                    }
                    break;

                // Có  bạn bè vừa online hoặc danh sách bạn bè, tùy theo nhóm mà thêm bạn bè vào
                // danh sách trên form
                case "#NEW_USER#":
                    content = msg;
                    int len;
                    len = content.Length;
                    while (len > 0)
                    {
                        pos = content.IndexOf("#");
                        string temp = content.Substring(0, pos);
                        if (temp != null)
                        {
                            string group = temp.Substring(0, temp.IndexOf("&&"));
                            temp = temp.Remove(0, temp.IndexOf("&&") + 2);
                            while (temp.Length > 0)
                            {
                                int vt = temp.IndexOf("$");
                                string name = temp.Substring(0, vt);
                                myFriend += name + "$";
                                TreeNode parentTree = null;
                                int status = 0;
                                for (int j = 0; j < treeViewListFriend.Nodes.Count; j++)
                                {
                                    if ((treeViewListFriend.Nodes[j].Text.Equals(group) == true) && (treeViewListFriend.Nodes[j].Name == ""))
                                    {
                                        parentTree = treeViewListFriend.Nodes[j];
                                        status = 1;
                                        break;
                                    }
                                    else if ((treeViewListFriend.Nodes[j].Text.Equals(group) == true) && (treeViewListFriend.Nodes[j].Name.Equals(name) == true))
                                    {
                                        status = 2;
                                        break;
                                    }
                                }
                                if (status == 0)
                                {
                                    parentTree = new TreeNode();
                                    parentTree.Text = group;
                                    parentTree.ImageIndex = 0;
                                    treeViewListFriend.Nodes.Add(parentTree);
                                    TreeNode child = new TreeNode();
                                    child.Name = name;
                                    child.Text = name;
                                    child.ImageKey = "soccer.png";
                                    parentTree.Nodes.Add(child);
                                }
                                else if (status == 1)
                                {
                                    TreeNode child = new TreeNode();
                                    child.Name = name;
                                    child.Text = name;
                                   
                                    child.ImageIndex = 11;
                                    parentTree.Nodes.Add(child);
                                }
                                temp = temp.Remove(0, vt + 1);
                            }
                        }
                        content = content.Remove(0, pos + 1);
                        len -= pos + 1;
                    }
                    break;


                // Nhận file từ một thành viên ở phòng chat
                // Kiểm tra sự xuất hiện của form chatroom, nếu chưa tồn tại --> tạo form mới
                // Gọi tới phương thức SaveFile để lưu file

                case "#SENDROOM#":
                    CHAT_ROOM[] chatRoomSendFile = new CHAT_ROOM[CLIENT_FORM.htSubFormChat.Count];
                    CLIENT_FORM.htSubFormChat.Values.CopyTo(chatRoomSendFile, 0);
                    pos = msg.IndexOf("#");
                    string roomF = msg.Substring(0, pos);
                    msg = msg.Remove(0, pos + 1);
                    pos = msg.IndexOf("#");
                    friend = msg.Substring(0, pos);
                    //Lay ten file
                    msg = msg.Remove(0, pos + 1);
                    pos = msg.IndexOf("#");
                    string fileRoomName = msg.Substring(0, pos);
                    msg = msg.Remove(0, pos + 1);
                    // Kiem tra xem xuat hien subform chua?
                    for (int i = 0; i < chatRoomSendFile.Length; i++)
                    {
                        if (chatRoomSendFile[i].Equals(htSubFormChat[roomF]))
                        {
                            chatRoomSendFile[i].SaveFile(fileRoomName, msg);
                            exist = true;
                        }
                    }
                    if (exist == false)
                    {
                        ShowFormChatRoom newForm = new ShowFormChatRoom(this, roomF, friend, me);
                        newForm.room.SaveFile(fileRoomName, msg);
                    }
                    break;

                // Nhận danh sách các thành viên phòng chat
                case "#USERROOM#":
                    CHAT_ROOM[] chatRoom1 = new CHAT_ROOM[CLIENT_FORM.htSubFormChat.Count];
                    CLIENT_FORM.htSubFormChat.Values.CopyTo(chatRoom1, 0);
                    pos = msg.IndexOf("#");
                    string roomName = msg.Substring(0, pos);
                    msg = msg.Remove(0, pos + 1);
                    // Kiem tra xem xuat hien subform chua?
                    for (int i = 0; i < chatRoom1.Length; i++)
                    {
                        if (chatRoom1[i].Equals(htSubFormChat[roomName]))
                        {
                            chatRoom1[i].setFriend(msg);
                            exist = true;
                        }
                        else
                        {
                            exist = false;
                        }
                    }
                    if (exist == false)
                    {
                        ShowFormChatRoom newRoom1 = new ShowFormChatRoom(this, roomName, msg, me);
                    }
                    break;
                case "#LISTROOM#":
                    string invitor = msg.Substring(0, msg.IndexOf("$$"));
                    msg = msg.Remove(0, msg.IndexOf("$$") + 2);
                    pos = msg.IndexOf("#");
                    string roomName1 = msg.Substring(0, pos);
                    msg = msg.Remove(0, pos + 1);
                    if (MessageBox.Show(invitor + " đã mời bạn vào phòng chat " + roomName1, "Chat room", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        CHAT_ROOM[] chatRoom2 = new CHAT_ROOM[CLIENT_FORM.htSubFormChat.Count];
                        CLIENT_FORM.htSubFormChat.Values.CopyTo(chatRoom2, 0);
                 
                        // Kiem tra xem xuat hien subform chua?
                        for (int i = 0; i < chatRoom2.Length; i++)
                        {
                            if (chatRoom2[i].Equals(htSubFormChat[roomName1]))
                            {
                                chatRoom2[i].setFriend(msg);
                                exist = true;
                            }
                            else
                            {
                                exist = false;
                            }
                        }
                        if (exist == false)
                        {
                            ShowFormChatRoom newRoom2 = new ShowFormChatRoom(this, roomName1, msg, me);
                        }
                    }
                    else
                    {
                        newConn.SendMessage(roomName1, me, invitor, 8); 
                    }
                    break;

                // Có thành viên đăng xuất
                // Xóa thành viên này khỏi form trên màn hình
                case "#USLOGOUT#":
                    pos = msg.IndexOf("#");
                    friend = msg.Substring(0, pos);
                    pos = myFriend.IndexOf(friend);
                    string tempName = myFriend.Substring(0, pos);
                    myFriend = myFriend.Remove(0, pos + friend.Length + 1);
                    myFriend = tempName + myFriend;
                    MessageBox.Show(friend + " đã thoát khỏi hệ thống!");
                    for (int i = 0; i < treeViewListFriend.Nodes.Count; i++)
                    {
                        int count = treeViewListFriend.Nodes[i].GetNodeCount(true);
                        for (int j = 0; j < count; j++)
                        {
                            if (treeViewListFriend.Nodes[i].Nodes[j].Name == friend)
                            {
                                int k = j;
                                for (; k < count - 1; k++)
                                {
                                    treeViewListFriend.Nodes[i].Nodes[k].Text = treeViewListFriend.Nodes[i].Nodes[k + 1].Text;
                                    treeViewListFriend.Nodes[i].Nodes[k].Name = treeViewListFriend.Nodes[i].Nodes[k + 1].Name;
                                }
                                treeViewListFriend.Nodes[i].Nodes[k].Remove();
                                count = k;
                            }
                        }
                    }
                    break;
                // Bạn bè thay đổi avatar
                case "#AVATARUD#":
                    pos = msg.IndexOf("#");
                    friend = msg.Substring(0, pos);
                    MessageBox.Show(friend + " đã thay đổi avatar");
                    string newAvatar = msg.Remove(0, pos + 1);
                    for (int i = 0; i < treeViewListFriend.Nodes.Count; i++)
                    {
                        int count = treeViewListFriend.Nodes[i].GetNodeCount(true);
                        for (int j = 0; j < count; j++)
                        {
                            if (treeViewListFriend.Nodes[i].Nodes[j].Name == friend)
                            {                
                                treeViewListFriend.Nodes[i].Nodes[j].ImageKey = newAvatar + ".png";
                            }
                        }
                    }
                    break;
                // Thông điệp từ server hiển thị việc đăng kí tài khoản thành công
                case "#REGISTER#":
                    MessageBox.Show("Đăng kí thành công");
                    ConnectToServer.connected = false;
                    newConn.killThread();
                    buttonLogin.Enabled = true;
                    buttonRegister.Enabled = true;
                    break;
                // Xử lí trường hợp bạn bè không online, thoát khỏi phòng chat hoặc không đồng ý tham gia phòng chat
                case "#FRNOT_ON#":
                case "#OUT_ROOM#":
                case "#NOT_JOIN#":
                    string yourFriend = msg.Substring(0, msg.IndexOf("#"));
                    msg = msg.Remove(0, msg.IndexOf("#") + 1);
                    string yourRoom = msg;
                    CHAT_ROOM[] yourListRoom = new CHAT_ROOM[CLIENT_FORM.htSubFormChat.Count];
                    CLIENT_FORM.htSubFormChat.Values.CopyTo(yourListRoom, 0);
                    // Kiem tra xem xuat hiện subform chua?
                    for (int i = 0; i < yourListRoom.Length; i++)
                    {
                        if (yourListRoom[i].Equals(htSubFormChat[yourRoom]))
                        {
                            yourListRoom[i].delFriend(yourFriend);
                            exist = true;
                        }
                        else
                        {
                            exist = false;
                        }
                    }
                    if(head.Equals("#FRNOT_ON#") == true)
                    {
                        MessageBox.Show(yourFriend + " không online");
                    }
                    else if (head.Equals("#OUT_ROOM#") == true)
                    {
                        MessageBox.Show(yourFriend + " đã ra khỏi phòng chat");
                    }
                    else
                    {
                        MessageBox.Show(yourFriend + " từ chối tham gia phòng chat: " + yourRoom);
                    }
                    break;
               
                // Thông điệp từ server --> Đăng kí thất bại
                case "#REA_FAIL#":
                    MessageBox.Show("Đăng kí thất bại, tài khoản đã tồn tại");
                    ConnectToServer.connected = false;
                    newConn.killThread();
                    textBoxPassword.Enabled = true;
                    textBoxUserName.Enabled = true;
                    buttonRegister.Enabled = true;
                    buttonLogin.Enabled = true;
                    buttonLogout.Enabled = false;
                    textBoxUserName.Text = "";
                    textBoxPassword.Text = "";
                    break;
               
                // Thông điệp từ server thông báo việc đăng nhập không thành công
                case "#LOG_FAIL#":
                    MessageBox.Show("Đăng nhập thất bại, thông tin không hợp lệ");
                    ConnectToServer.connected = false;
                    newConn.killThread();
                    textBoxPassword.Enabled = true;
                    textBoxUserName.Enabled = true;
                    buttonRegister.Enabled = true;
                    buttonLogout.Enabled = false;
                    textBoxUserName.Text = "";
                    textBoxPassword.Text = "";
                    break;

                // Đăng nhập thành công
                case "#LSUCCESS#":
                    if (clientN != null)
                    {
                        break;
                    }
                    else
                        MessageBox.Show("Đăng nhập thành công");
                    clientN = msg;
                    AddFriendToolStripMenuItem.Enabled = true;
                    chatRoomToolStripMenuItem.Enabled = true;
                    //DeleteFriendToGroupToolStripMenuItem.Enabled = true;
                    webcamToolStripMenuItem.Enabled = true;
                    buttonChangedAvatar.Enabled = true;
                    buttonLogout.Enabled = true;
                    buttonLogin.Enabled = false;
                    break;

                // Thêm bạn thất bại
                case "#ADD_FAIL#":
                    MessageBox.Show(msg);
                    break;

                // Thêm bạn thành công, lấy tên và nhóm đưa vào danh sách trên màn hình
                case "#ADDFR_OK#":
                    MessageBox.Show("Thêm bạn thành công");
                    string group_name = msg.Substring(0, msg.IndexOf("#"));
                    msg = msg.Remove(0, msg.IndexOf("#") + 1);
                    string friend_name = msg.Substring(0, msg.IndexOf("#$#"));
                    TreeNode treeParent = null;
                    int checkStatus = 0;
                    for (int j = 0; j < treeViewListFriend.Nodes.Count; j++)
                    {
                        if ((treeViewListFriend.Nodes[j].Text.Equals(group_name) == true) && (treeViewListFriend.Nodes[j].Name == ""))
                        {
                            treeParent = treeViewListFriend.Nodes[j];
                            checkStatus = 1;
                            break;
                        }
                    }
                    if (checkStatus == 0)
                    {
                        treeParent = new TreeNode();
                        treeParent.Text = group_name;
                        treeViewListFriend.Nodes.Add(treeParent);
                    }
                    TreeNode treeChild = new TreeNode();
                    treeChild.Name = friend_name;
                    treeChild.Text = friend_name;
                    treeParent.Nodes.Add(treeChild);
                    break;

                // Xóa bạn thành công, loại ra khỏi danh sách
                case "#DELETEOK#":
                    MessageBox.Show("Xóa thành viên " + msg + " thành công");
                    for (int i = 0; i < treeViewListFriend.Nodes.Count; i++)
                    {
                        int count = treeViewListFriend.Nodes[i].GetNodeCount(true);
                        for (int j = 0; j < count; j++)
                        {
                            if (treeViewListFriend.Nodes[i].Nodes[j].Name == msg)
                            {
                                int k = j;
                                for (; k < count - 1; k++)
                                {
                                    treeViewListFriend.Nodes[i].Nodes[k].Text = treeViewListFriend.Nodes[i].Nodes[k + 1].Text;
                                    treeViewListFriend.Nodes[i].Nodes[k].Name = treeViewListFriend.Nodes[i].Nodes[k + 1].Name;
                                }
                                treeViewListFriend.Nodes[i].Nodes[k].Remove();
                                count = k;
                            }
                        }
                    }
                    break;
                case "#DEL_FAIL#":
                    MessageBox.Show(msg);
                    break;
            }
        }

        // Phương thức xử lí khi form chính được load 
        private void CLIENT_FORM_Load(object sender, EventArgs e)
        {
            AddFriendToolStripMenuItem.Enabled = false;
            chatRoomToolStripMenuItem.Enabled = false;
            webcamToolStripMenuItem.Enabled = false;
            //DeleteFriendToGroupToolStripMenuItem.Enabled = false;
            buttonChangedAvatar.Enabled = false;
            listRoom = "";
        }

        // Xử lí sự kiện khi click vào menu help
        private void helpToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            const string msg = "Client - BTL Công nghệ .Net";
            const string caption = "BK Messenger's Information";
            MessageBox.Show(null, msg, caption, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        // Xử lí sự kiện khi click vào menu Chat room
        private void chatRoomToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // Tạo phòng chat room
            try
            {
                CREATE_ROOM newRoom = new CREATE_ROOM(this,listRoom);
                newRoom.Show();
            }
            // Lỗi tạo phòng
            catch
            {
                MessageBox.Show("Tạo phòng chat không thành công");
            }
        }

        // Xử lí sự kiện click vào menu Exit
        // Giải phóng tài nguyên, đóng form
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            BK_CHAT[] chatForms = new BK_CHAT[CLIENT_FORM.htSubFormFriend.Count];
            if(chatForms != null)
            {
                CLIENT_FORM.htSubFormFriend.Values.CopyTo(chatForms, 0);
                for(int i = 0; i < treeViewListFriend.Nodes.Count; i++)
                {
                    string name = treeViewListFriend.Nodes[i].Name;
                    if (name != null)
                    {
                        for (int j = 0; j < chatForms.Length; j++)
                        {
                            if (chatForms[j].Equals(htSubFormFriend[name]))
                            {
                                ShowSubForm.RemoveSubForm(name);
                            }
                        }
                    }
                }
                this.Dispose();
                this.Close();
            }
        }

        // Xử lí sự kiện chọn người chat
        private void treeViewListFriend_AfterSelect(object sender, TreeViewEventArgs e)
        {
            for (int i = 0; i < treeViewListFriend.Nodes.Count; i++)
            {
                if (treeViewListFriend.SelectedNode.Name != "")
                {
                    try
                    {
                        BK_CHAT[] chatNew = new BK_CHAT[CLIENT_FORM.htSubFormFriend.Count];
                        CLIENT_FORM.htSubFormFriend.Values.CopyTo(chatNew, 0);
                        // Kiem tra xem xuat hien subform chua?
                        for (int j = 0; j < chatNew.Length; j++)
                        {
                            if (chatNew[j].Equals(htSubFormFriend[treeViewListFriend.SelectedNode.Name]))
                            {
                                this.RemoveChatDialog(treeViewListFriend.SelectedNode.Name);
                            }
                        }
                        ShowSubForm newForm = new ShowSubForm(this, me, treeViewListFriend.SelectedNode.Name);
                    }
                    catch
                    {
                        MessageBox.Show("Không thể chat với: " + treeViewListFriend.SelectedNode.Name);
                    }
                }
            }
        }

        // Xử lí sự  kiện khi click menu Add Friend
        // Hiển thị form thêm bạn
        // Không hiển thị được thì thông báo
        private void AddFriendToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                ADD_FRIEND addNew = new ADD_FRIEND(this, me);
                addNew.Show();
            }
            catch
            {
                MessageBox.Show("Không tạo được form add friend");
            }
        }

        private void imageComboBoxAvatar_SelectedIndexChanged(object sender, EventArgs e)
        {
            avatar = imageComboBoxAvatar.Text;
        }

        private void buttonChangedAvatar_Click(object sender, EventArgs e)
        {
            pictureBoxAvatar.ImageLocation = sDirAvatar + avatar + ".png";
            if(myFriend != "")
                newConn.SendMessage(avatar,me,myFriend,6);
        }

        private void webcamToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // bat webcam 
            wc = new ClientWebcam();
            wc.Show();
            wc.ClientWC.StartCamera();
        }

        //Get name of friend when right click and Start choose Delete
        private void treeListrightclick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
               // string sFriendDelete = "";
                try
                {
                    if (treeViewListFriend.SelectedNode.Name != "")
                    {
                        contextMenuDelete.Show(MousePosition.X, MousePosition.Y);
                        sNameOfFriendDelete = treeViewListFriend.SelectedNode.Name;
                    }
                }
                catch
                {
                    MessageBox.Show("Không thể tạo form delete, hãy thử sau");
                }
            }
        }

        //Delete friend by right click
        private void DeleteFriend_Click(object sender, EventArgs e)
        {
            if (sNameOfFriendDelete != "")
            {
                this.GetText(sNameOfFriendDelete, me, sNameOfFriendDelete, 5);
                sNameOfFriendDelete = "";
            }
        }



        private void ClickClose(object sender, FormClosedEventArgs e)
        {
            try
            {
                newConn.Logout();
            }
            catch
            {
                // close khi chua ket noi server => gay exception
            }

            BK_CHAT[] chatForms = new BK_CHAT[CLIENT_FORM.htSubFormFriend.Count];
            if (chatForms != null)
            {
                CLIENT_FORM.htSubFormFriend.Values.CopyTo(chatForms, 0);
                for (int i = 0; i < treeViewListFriend.Nodes.Count; i++)
                {
                    string name = treeViewListFriend.Nodes[i].Name;
                    if (name != null)
                    {
                        for (int j = 0; j < chatForms.Length; j++)
                        {
                            if (chatForms[j].Equals(htSubFormFriend[name]))
                            {
                                ShowSubForm.RemoveSubForm(name);
                            }
                        }
                    }
                }
                this.Dispose();
                this.Close();
            }
        }

        
    }


    // Lớp giữ đối số cho sự kiện StatusChanged
    public class StatusChangedEventArgs : EventArgs
    {
        // Dữ liệu mô tả cho sự kiện
        private string EventMsg;

        // Sự kiện nhận và gửi thông điệp
        public string EventMessage
        {
            get
            {
                return EventMsg;
            }
            set
            {
                EventMsg = value;
            }
        }

        // Khởi tạo lớp
        public StatusChangedEventArgs(string strEventMsg)
        {
            EventMsg = strEventMsg;
        }
    }

    // Xác định đối tượng Handler đang tham chiếu 
    public delegate void StatusChangedEventHandler(object sender, StatusChangedEventArgs e);

    // Phương thức hiển thị một form chat
    public class ShowSubForm
    {
        // khai báo một form chat
        public  BK_CHAT chatClient;

        // Phương thức khởi tạo from chat
        // Tên hai thành viên giao tiếp với nhau
        // Form chính của thành viên hiện tại
        public ShowSubForm(CLIENT_FORM mainForm, string source, string destination)
        {
            try
            {
                chatClient = new BK_CHAT(mainForm, source, destination);
                CLIENT_FORM.htSubFormFriend.Add(destination, chatClient);
                CLIENT_FORM.htSubForm.Add(chatClient, destination);
                chatClient.Show();
            }
            catch { }
        }

        // Phương thức hủy form
        public static void RemoveSubForm(string destination)
        {
            BK_CHAT[] chatRoomFail = new BK_CHAT[CLIENT_FORM.htSubFormFriend.Count];
            CLIENT_FORM.htSubFormFriend.Values.CopyTo(chatRoomFail, 0);
            // Kiem tra xem xuat hien subform chua?
            for (int i = 0; i < chatRoomFail.Length; i++)
            {
                if (chatRoomFail[i].Equals(CLIENT_FORM.htSubFormFriend[destination]))
                {
                    chatRoomFail[i].Close();
                }
            }
            CLIENT_FORM.htSubForm.Remove(CLIENT_FORM.htSubFormFriend[destination]);
            CLIENT_FORM.htSubFormFriend.Remove(destination);
        }
    }

    // Phương thức khởi tạo form chat room
    public class ShowFormChatRoom
    {
        // Khai báo một form chat room
        public CHAT_ROOM room;

        // Khởi tạo form chat room
        // Tên của thành viên
        // Form chính của thành viên hiện tại
        public ShowFormChatRoom(CLIENT_FORM mainForm, string nameRoom, string members, string owner)
        {
            try
            {
                room = new CHAT_ROOM(mainForm, nameRoom, members, owner);
                CLIENT_FORM.htSubFormChat.Add(nameRoom, room);
                CLIENT_FORM.htChatForm.Add(room, nameRoom);
                room.Show();
            }
            catch (Exception e)
            {
                MessageBox.Show("Không thể tạo phòng chat" + e.ToString());
            }
        }

        // Phương thức hủy form chat room
        public static void RemoveFormRoom(string destination)
        {
            CHAT_ROOM[] chatRoomFail = new CHAT_ROOM[CLIENT_FORM.htSubFormChat.Count];
            CLIENT_FORM.htSubFormChat.Values.CopyTo(chatRoomFail, 0);
            // Kiem tra xem xuat hien subform chua?
            for (int i = 0; i < chatRoomFail.Length; i++)
            {
                if (chatRoomFail[i].Equals(CLIENT_FORM.htSubFormChat[destination]))
                {
                    chatRoomFail[i].Close();
                }
            }
            CLIENT_FORM.htChatForm.Remove(CLIENT_FORM.htSubFormChat[destination]);
            CLIENT_FORM.htSubFormChat.Remove(destination);
        }
    }

    // Phương thức qui định kết nối tới  server
    public class ConnectToServer
    {
        // Đối tượng lắng nghe thông điệp
        TcpClient tcpServer;
        // Đối tượng truyền các sự kiện
        public static event StatusChangedEventHandler statusChange;
        // Đối tượng giữ các thông  điệp khi có sự cập nhật thông điệp
        public static StatusChangedEventArgs statusArgs;
        // Đối tượng ghi dữ liệu vào một dòng tin
        StreamWriter swSender;
        // Thread nhận tin nhắn
        private Thread thrMessaging;
        // Đối tượng nhận dữ liệu từ một dòng tin
        private StreamReader srReceiver;
        // Biến để xác nhận tình trạng kết nối
        public static bool connected;
        // Tên người dùng
        public static string userName;
        // Mật khẩu người dùng
        private string userPassword;
        // Biến lưu trữ dòng tin nhận được
        private string svResponse;
        // Biến xác kiểu kết nối
        public string header;

        // Phương thức khởi tạo
        // Khởi tạo tên người dùng, mật khẩu, kiểu kết nối
        //  header = kind --> header : #REGISTER#  hoặc  #LOGIN#
        public ConnectToServer(string name, string pass, string kind)
        {
            userName = name;
            userPassword = pass;
            header = kind;
            ConnectToServer.connected = false;
            if(Connect() == true)
            {
                thrMessaging = new Thread(new ThreadStart(ReceiveMsg));
                thrMessaging.Start();
                ConnectToServer.connected = true;
            }
        }
        public void killThread()
        {
            thrMessaging.Abort();
            tcpServer.Close();
            swSender.Close();
            srReceiver.Close();
        }
        // Phương thức xử lí sự kiện đăng xuất
        // Gửi thông điệp đăng xuất tới server
        // Giải phóng tài nguyên
        public void Logout()
        {
            try
            {
                svResponse = "#USLOGOUT#" + userName + "#" + userPassword + "#$#";
                swSender = new StreamWriter(tcpServer.GetStream());
                swSender.WriteLine(svResponse);
                swSender.Close();
                thrMessaging.Abort();
                srReceiver.Close();
                tcpServer.Close();
            }
            catch
            { }
        }

        // Phương thức dùng cập nhật sự thay đổi trạng thái
        public static void OnStatusChanged(StatusChangedEventArgs e)
        {
            StatusChangedEventHandler statusHandler = statusChange;
            if (statusHandler != null)
            {
                // Invoke the delegate
                statusHandler(null, e);
            }
        }

        // Phương thức tiến hành kết nối tới server
        // Khởi tạo m đối tượng  mới để  lắng nghe, kết nối với server tại:
        // Địa chỉ IP: 192.168.7.124
        // Cổng : 90
        // Gửi thông điệp đầu tiên(đăng kí hoặc đăng nhập)
        public bool Connect()
        {
            try
            {
                tcpServer = new TcpClient();
                tcpServer.Connect("192.168.7.124", 90);
                swSender = new StreamWriter(tcpServer.GetStream());
                svResponse = header + userName + "#" + userPassword + "#$#";
                swSender.WriteLine(svResponse);
                swSender.Flush();
                return true;
            }
            catch
            {
                MessageBox.Show("Không thể kết nối tới máy chủ");
                return false;
            }
        }

        // Phương thức nhận dòng tin
        // Nhận được dòng tin --> Cập  nhật dữ liệu
        public void ReceiveMsg()
        { 
            while(true)
            {
                try
                {
                    svResponse = "";
                    srReceiver = new StreamReader(tcpServer.GetStream());
                    svResponse = srReceiver.ReadLine();
                    statusArgs = new StatusChangedEventArgs(svResponse);
                    OnStatusChanged(statusArgs);
                    
                }
                catch
                {
                    //MessageBox.Show("không nhận được dữ liệu");
                    srReceiver.Close();
                }
            }
        }

        // Phương thức gửi tin
        public void SendMessage(string newMsg, string source, string destination, int kindChat)
        {
            string head = "";
            // Gửi nội dung chat trong chat room
            if(kindChat == 1)
            {
                head = "#CHATROOM#";
            }
            // Gửi thành viên chat trong chat room
            else if (kindChat == 2)
            {
                head = "#USERROOM#" + CLIENT_FORM.clientN + "#";            
            }
            // Gửi danh sách thành viên chat trong chat room
            else if(kindChat == 3)
            {
                head = "#LISTROOM#" + CLIENT_FORM.clientN + "#";
            }
            // Gửi yêu cầu thêm bạn
            else if(kindChat == 4)
            {
                head = "#ADDFREND#";
            }
            // Gửi yêu cầu xóa bạn
            else if(kindChat == 5)
            {
                head = "#DELETEFR#";
            }
            // Gửi yêu cầu thay đổi avatar
            else if (kindChat == 6)
            {
                head = "#AVATARUD#";
            }
            else if(kindChat == 7)
            {
                head = "#OUT_ROOM#";
            }
            else if (kindChat == 8)
            {
                head = "#NOT_JOIN#";
            }
            // Gửi yêu cầu xem webcam
            else if (kindChat == 9)
            {
                head = "#RQWEBCAM#";
            }
            //  Trả yêu cầu xem webcam
            else if (kindChat == 10)
            {
                head = "#RPWEBCAM#";
            }
            // Gửi thông điệp chat giữa hai friend
            else
            {
                head = "#SEND_MSG#";
            }
            // Đóng gói dữ liệu theo chuẩn
            newMsg = head + destination + "#" + source + "#" + newMsg;
            // Gửi tin
            try
            {
                swSender = new StreamWriter(tcpServer.GetStream());
                swSender.WriteLine(newMsg);
                swSender.Flush();
            }
            // Lỗi do hỏng đối tượng truyền tin
            catch 
            {
                MessageBox.Show("Lỗi gửi dữ liệu" + tcpServer.ToString());
            }
        }

        //  Phương thức xử lí gửi file
        public void SendFile(string filePath, string source, string destination, int kindSend)
        {
            byte[] encData_byte = File.ReadAllBytes(filePath);
            string encodedData;
            try
            {
                encodedData = Convert.ToBase64String(encData_byte);
            }
            catch (Exception e)
            {
                throw new Exception("Error in base64Encode" + e.Message);
            }
            string fileName = "";
            filePath = filePath.Replace("\\", "/");
            while (filePath.IndexOf("/") > -1)
            {
                fileName += filePath.Substring(0, filePath.IndexOf("/") + 1);
                filePath = filePath.Substring(filePath.IndexOf("/") + 1);
            }
            string head = "";
            // Gửi file trong phòng chat
            if(kindSend == 1)
            {
                head = "#SENDROOM#";
            }
            // Gửi file cho bạn
            else
            {
                head = "#SENDFILE#";
            }
            string newMsg = head + destination + "#" + source + "#" + filePath + "#" + encodedData;
            swSender = new StreamWriter(tcpServer.GetStream());
            swSender.WriteLine(newMsg);
            swSender.Flush();
        }
    }
}
